home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-4331 / makefast / source / makefast.pas < prev    next >
Pascal/Delphi Source File  |  1993-09-15  |  16KB  |  406 lines

  1. program MakeFast;
  2.   {$B-,D-,G-,I-,L-,N-,R-,S-,V-,X+}
  3.   { Copyright (c)1992 by Softdesign Computer Software
  4.                                written by Thomas Much }
  5.   { wer sich eingehender mit den FastLoad-Flags beschäftigen
  6.     möchte, sollte sich einmal das ST-STE-TT-Profibuch ansehen! }
  7.  
  8.   uses Gem,GObjects; { ObjectGEM immer als letzte Unit einbinden,
  9.                        allerdings noch vor auf GObjects zugreifenden
  10.                        Units! }
  11.  
  12.     const
  13.           {$I makefast.i}  { Konstanten für die Dialogbox }
  14.  
  15.           PH_FASTLOAD  = 1;       { die Fastload-Flags... }
  16.           PH_LOADALT   = 2;
  17.           PH_MALLOCALT = 4;
  18.  
  19.   type PH = record
  20.                             ph_branch  : word;     { Programmheader }
  21.                             ph_tlen    : longint;
  22.                             ph_dlen    : longint;
  23.                             ph_blen    : longint;
  24.                             ph_slen    : longint;
  25.                             ph_res1    : longint;
  26.                             ph_prgflags: longint;
  27.                             ph_absflag : word;
  28.                         end;
  29.  
  30.              TMFApplication = object(TApplication)
  31.                                                      { der neue Anwendungs-Objekt-TYP }
  32.                                                     procedure InitInstance; virtual;
  33.                                                   procedure InitMainWindow; virtual;
  34.                                                   procedure HandleAV(Pipe: Pipearray); virtual;
  35.                                               end;
  36.  
  37.              PMFDialog  = ^TMFDialog;
  38.              TMFDialog = object(TDialog)
  39.                                           { der eigentliche Dialog }
  40.                                          ttmem                  : integer;
  41.                                          datei,pfad             : string;
  42.                                          st1,st2,st3,st4        : PStatic;
  43.                                          cb1,cb2,cb3            : PCheckBox;
  44.                                          pb1,pb2,pb3,pb4,pb5,pb6: PButton;
  45.                                          phrec                  : PH;
  46.                                          f                      : file of PH;
  47.                                          procedure GetWindowClass(var AWndClass: TWndClass); virtual;
  48.                                          procedure SetupWindow; virtual;
  49.                                          function ExitDlg(AnIndx: integer): boolean; virtual;
  50.                                          function OK: boolean; virtual;
  51.                                          function Help: boolean; virtual;
  52.                                          { neue Routinen... }
  53.                                          procedure UpdateAmount; virtual;
  54.                                          procedure DisableAll; virtual;
  55.                                          procedure Load(dname: string); virtual;
  56.                                      end;
  57.  
  58.   var MFApplication: TMFApplication;
  59.                                        { das Anwendungs-Objekt;
  60.                                          dies sollte das EINZIGE statische Objekt
  61.                                          sein, alle anderen werden normalerweise
  62.                                          dynamisch verwaltet! }
  63.  
  64.  
  65. procedure MFResource; external; {$L mfrsc.o}
  66.     { die Resource wird ins Programm eingebunden (wichtig für ACCs) }
  67.  
  68.  
  69. procedure TMFApplication.InitInstance;
  70.  
  71.     begin
  72.         { wird eine Anwendung das erste Mal in den Speicher geladen,
  73.           wird die Methode InitApplication aufgerufen, die u.a. die
  74.           boolean-Variable FirstInstance setzt; danach wird InitInstance
  75.           aufgerufen;
  76.           wird die Anwendung ein zweites Mal geladen (z.B. zuerst als ACC
  77.           und dann als Prg), wird NUR diese Methode InitInstance von
  78.           dem Konstruktor Init aufgerufen! }
  79.         InitResource(@MFResource);
  80.         { die im Prg eingebundene Resource wird initialisiert;
  81.           soll das RSC-File nachgeladen werden, wird statt InitResource()
  82.           einfach LoadResource(datei) aufgerufen }
  83.         TApplication.InitInstance
  84.         { Standard-Initialisierungen, setzt Schnittstellenobjekt für
  85.           <Control>+<Q>-Tastenkombination und ruft InitMainWindow auf }
  86.     end;
  87.  
  88.  
  89. procedure TMFApplication.InitMainWindow;
  90.     var p: PMFDialog;
  91.  
  92.     begin
  93.         { InitMainWindow legt ein "ganz einfaches" GEM-Fenster an und wird
  94.           deshalb eigentlich immer überschrieben, um ein abgeleitetes Fenster-
  95.           objekt zu installieren;
  96.           dieser Aufruf ist insofern besonders, als daß wir kein FENSTER,
  97.           sondern einen DIALOG als "MainWindow" anmelden; dieser wird zwar
  98.           normalerweise in einem Fenster dargestellt, sollte allerdings kein
  99.           Fenster-Handle mehr verfügbar sein, macht ObjectGEM daraus auto-
  100.           matisch (zur Laufzeit) einen MODALEN Dialog! }
  101.         p:=new(PMFDialog,Init(nil,'ObjectGEM MakeFast',MFDLG));
  102.         { der Dialog trägt sich selbständig in die Fensterliste ein;
  103.           MainWindow zeigt immer auf das erste installierte TWindow-Objekt
  104.           (in diesem Fall auf einen Nachfahren);
  105.           dem Konstruktor wird das Parent-Objekt (in diesem Fall nil, es
  106.           existiert also kein Parent), der Fenstertitel und der Index des
  107.           Dialogbaums übergeben }
  108.         if (MainWindow=nil) or (ChkError<em_OK) then Status:=em_InvalidMainWindow
  109.             { irgendwas ist schiefgelaufen, nicht initialisieren;
  110.               ObjectGEM prüft dann, wie und ob (ACCs!) das Programm
  111.               verlassen wird }
  112.         else
  113.             begin
  114.                 { p zeigt auf den Dialog; nun werden die Schnittstellen-
  115.                   objekte initialisiert; diese tragen sich in die Liste
  116.                   der TControl-Objekte im Dialog-Objekt ein und werden
  117.                   dadurch beim freigeben des Dialogs automatisch mitge-
  118.                   löscht }
  119.                 { die Rückgabe-Pointer werden gespeichert, um später die
  120.                   Objekte mit ihren eigenen Methoden zu modifizieren! }
  121.                 p^.st1:=new(PStatic,Init(p,MFNAME,20,false,'Zeigt den Namen des ausgewählten|Programms (ohne Laufwerk+Pfad) an.'));
  122.                 { einfacher Text, übergeben wird u.a. die max. Länge des Textes+1
  123.                   (Nullbyte), einen boolean-Wert, der angibt, ob der Text unter-
  124.                   strichen wird, und der String für BubbleHelp (!);
  125.                   bringen Sie den Mauscursor doch mal über einen Button und
  126.                   drücken Sie dann <Help> ...!?!!! }
  127.                 p^.st2:=new(PStatic,Init(p,MFMINDT,0,false,'Gibt an, wieviel TT-RAM (Alternate|RAM) dem Programm genügt, wenn mehr|ST-RAM als TT-RAM vorhanden ist.'));
  128.                 p^.st3:=new(PStatic,Init(p,MFAMOUNT,8,false,'Gibt an, wieviel TT-RAM (Alternate|RAM) dem Programm genügt, wenn mehr|ST-RAM als TT-RAM vorhanden ist.'));
  129.                 p^.st4:=new(PStatic,Init(p,MFVER,39,false,'ObjectGEM MakeFast ist Freeware, d.h. Sie dürfen|das Programm kostenlos kopieren und benutzen.|Änderungen am Programm sind nicht erlaubt!'));
  130.                 p^.cb1:=new(PCheckBox,Init(p,MFFAST,true,'Bestimmt das FastLoad-Flag.|Ist es gesetzt, wird beim Programmstart nur die BSS|gelöscht. Das Flag sollte bei mindestens je einem|Auto-Ordner-Programm und Accessory NICHT gesetzt sein!'));
  131.                 { ankreuzbare Box; der boolean-Wert gibt an, ob die CheckBox
  132.                   im "neuen" Stil gezeichnet wird; ist in der Resource das
  133.                   CROSSED-Attribut gesetzt, wird statt des Häkchens ein
  134.                   Kreuzchen verwendet }
  135.                 p^.cb2:=new(PCheckBox,Init(p,MFPROG,true,'Das Programm darf in das (schnelle)|TT-RAM geladen werden. Vorsicht, wenn das Pro-|gramm z.B. den Bildschirmspeicher verschiebt!'));
  136.                 p^.cb3:=new(PCheckBox,Init(p,MFMEM,true,'Malloc()-Anforderungen des Programms dürfen aus dem|TT-RAM bedient werden. Vorsicht bei Programmen,|die z.B. den Bildschirmspeicher verschieben!'));
  137.                 p^.pb1:=new(PButton,Init(p,MFDATEI,id_No,true,'Wählt ein neues Programm|zum Bearbeiten aus.'));
  138.                 { ein PushButton }
  139.                 p^.pb2:=new(PButton,Init(p,MFMAKE,id_No,true,'Schreibt die neuen Werte in|das ausgewählte Programm.'));
  140.                 p^.pb3:=new(PButton,Init(p,MFOK,id_OK,true,'Verläßt MakeFast.'));
  141.                 { id_OK bedeutet, daß dies der OK-Button ist;
  142.                   beim Anklicken wird dadurch die TDialog.OK-Methode aufgerufen }
  143.                 p^.pb4:=new(PButton,Init(p,MFLESS,id_No,false,'Vermindert den TT-RAM-Bedarf um 128 KB.'));
  144.                 p^.pb5:=new(PButton,Init(p,MFMORE,id_No,false,'Erhöht den TT-RAM-Bedarf um 128 KB.'));
  145.                 p^.pb6:=new(PButton,Init(p,MFHELP,id_Help,false,'Zeigt einen allgemeinen Hilfstext an.'));
  146.                 p^.st4^.SetText('VERSION 1.0 VOM 29.09.1992 (FREEWARE!)');
  147.                 { Text setzen (TStatic-Methode) }
  148.                 p^.UpdateAmount;
  149.                 p^.DisableAll;
  150.                 if AppFlag then p^.MakeWindow
  151.                 { wenn wir kein ACC sind, wird das Fenster sofort
  152.                   geöffnet, sonst wartet ObjectGEM auf das Eintreffen
  153.                   einer AC_OPEN-Message }
  154.             end
  155.     end;
  156.  
  157.  
  158. procedure TMFApplication.HandleAV(Pipe: Pipearray);
  159.  
  160.     begin
  161.         { ObjectGEM verarbeitet AUTOMATISCH das AV- und XAcc-Protokoll }
  162.         if (pipe[0]=VA_START) or (pipe[0]=VA_DRAGACCWIND) then
  163.             PMFDialog(MainWindow)^.Load(Attr.rpTail^)
  164.         { beim Eintreffen dieser AV-Messages aktualisiert ObjectGEM
  165.           die Kommandozeile, die wir hier als neuen Programmnamen auffassen }
  166.     end;
  167.  
  168.  
  169. procedure TMFDialog.GetWindowClass(var AWndClass: TWndClass);
  170.  
  171.     begin
  172.         TDialog.GetWindowClass(AWndClass);
  173.         { initialisiert die Dialog-Klasse;
  174.           wenn Sie dies vergessen, werden Sie die seltsamsten
  175.           Systemabstürze erleben (vertrauen Sie mir, ich weiß,
  176.           was ich erlebt habe...);
  177.           bei OOP kommt es oft vor, daß Vorfahren aufgerufen
  178.           werden; wann dies geschehen kann, muß oder unterbleiben
  179.           sollte, wird in der ObjectGEM-Dokumentation (bzw. in der
  180.           Online-Help) beschrieben sein }
  181.         AWndClass.Style:=AWndClass.Style or cs_CreateOnAccOpen
  182.         { da wir einen Dialog als "Hauptfenster" verwenden, müssen
  183.           wir ObjectGEM sagen, daß dieser Dialog bei einer AC_OPEN-
  184.           Message (also bei Anwahl des Accessory-Menüeintrags) ge-
  185.           öffnet werden soll; normalerweise werden in diesem Fall nur
  186.           Fenster geöffnet, da es recht störend ist, wenn alle irgend-
  187.           wann verwendeten Dialoge automatisch geöffnet werden;
  188.           andererseits können Sie natürlich auch Fenster vom auto-
  189.           matischen Öffnen ausnehmen, indem Sie das Flag in der Fenster-
  190.           Klasse löschen }
  191.     end;
  192.  
  193.  
  194. procedure TMFDialog.SetupWindow;
  195.  
  196.     begin
  197.         { diese Methode wird vom Init-Konstruktor des Dialogs aufgerufen }
  198.         TDialog.SetupWindow;
  199.         { initialisiert Schnittstellenobjekte für <Control>+<F>,
  200.           <Control>+<U> und <Control>+<W> }
  201.         ttmem:=0;
  202.         { TT-RAM-Bedarf = minimal }
  203.         datei:='';
  204.         pfad:=''
  205.         { zu Anfang ist keine Datei geladen }
  206.     end;
  207.  
  208.  
  209. function TMFDialog.ExitDlg(AnIndx: integer): boolean;
  210.  
  211.     begin
  212.         { beim Anklicken eines PushButtons wird die EndDlg-Methode
  213.           aufgerufen; diese versucht, den Button einem Schnittstellen-
  214.           objekt zuzuordnen (z.B. wird beim OK-Button [id_OK] auto-
  215.           matisch die OK-Methode [s.u.] aufgerufen);
  216.           konnte kein solches Schnittstellenobjekt gefunden werden,
  217.           wird diese ExitDlg-Methode aufgerufen;
  218.           liefert sie true zurück, wird der Dialog daraufhin verlassen }
  219.         case AnIndx of
  220.             MFLESS: if ttmem>0 then
  221.                                 begin
  222.                                     dec(ttmem);
  223.                                     { TT-RAM-Bedarf um 128 KB verringern... }
  224.                                     UpdateAmount
  225.                                     { ... und Bedarf anzeigen }
  226.                                 end;
  227.             MFMORE: if ttmem<15 then
  228.                                 begin
  229.                                     inc(ttmem);
  230.                                     { TT-RAM-Bedarf erhöhen }
  231.                                     UpdateAmount
  232.                                 end;
  233.             MFDATEI: begin
  234.                                  datei:=FileSelect('PRG/APP/ACC/TOS/TTP AUSWÄHLEN',pfad,'*.*');
  235.                                  { neue Datei auswählen... }
  236.                                  Load(datei)
  237.                                  { ... und anzeigen }
  238.                              end;
  239.             MFMAKE: begin
  240.                                 with phrec do
  241.                                     begin
  242.                                         ph_prgflags:=ph_prgflags and $0ffffff8;
  243.                                         { FastLoad-Flags zunächst ausmaskieren (löschen)... }
  244.                                         if cb1^.GetCheck=bf_Checked then
  245.                                             ph_prgflags:=ph_prgflags or PH_FASTLOAD;
  246.                                         if cb2^.GetCheck=bf_Checked then
  247.                                             ph_prgflags:=ph_prgflags or PH_LOADALT;
  248.                                         if cb3^.GetCheck=bf_Checked then
  249.                                             ph_prgflags:=ph_prgflags or PH_MALLOCALT;
  250.                                         PByte(@ph_prgflags)^:=PByte(@ph_prgflags)^ or (ttmem shl 4)
  251.                                         { ... und dann evtl. wieder setzen }
  252.                                     end;
  253.                                 reset(f);
  254.                                 write(f,phrec);
  255.                                 close(f);
  256.                                 { Datei aktualisieren }
  257.                                 DisableAll
  258.                                 { nun ist keine Datei mehr aktiv }
  259.                             end
  260.         end;
  261.         ExitDlg:=false
  262.         { Dialog NICHT verlassen }
  263.     end;
  264.  
  265.  
  266. function TMFDialog.OK: boolean;
  267.  
  268.     begin
  269.         Application^.Quit;
  270.         { Anwendung beenden (sobald der aktuelle Message-Loop
  271.           beendet ist)... }
  272.         OK:=true
  273.         { ... und vorher den Dialog verlassen }
  274.     end;
  275.  
  276.  
  277. function TMFDialog.Help: boolean;
  278.  
  279.     begin
  280.         form_alert(1,'[1][ Bringen Sie den Mauscursor| über das gewünschte Dialog-| element und drücken Sie die  | <Help>-Taste.][   OK   ]');
  281.         { Alertbox anzeigen (später geschieht dies mit Alert(), die Boxen
  282.           können dann auch nicht-modal sein) }
  283.         Help:=false
  284.         { Dialogbox nicht verlassen }
  285.     end;
  286.  
  287.  
  288. procedure TMFDialog.UpdateAmount;
  289.     const atxt : array [0..15] of string[7] =
  290.                             ('128 KB','256 KB','384 KB','512 KB','640 KB','768 KB',
  291.                              '896 KB','1 MB','1152 KB','1280 KB','1408 KB','1536 KB',
  292.                              '1664 KB','1792 KB','1920 KB','2 MB');
  293.  
  294.     begin
  295.         st3^.SetText(atxt[ttmem])
  296.         { TT-RAM-Bedarf anzeigen;
  297.           die TStatic-Methode SetText ruft automatisch die
  298.           von TControl geerbte Paint-Methode auf, die das Dialog-
  299.           element neu zeichnet, wenn der Dialog sichtbar ist }
  300.     end;
  301.  
  302.  
  303. procedure TMFDialog.DisableAll;
  304.  
  305.     begin
  306.         st1^.Clear;
  307.         { Dateinamen löschen... }
  308.         st2^.Disable;
  309.         st3^.Disable;
  310.         cb1^.Disable;
  311.         cb2^.Disable;
  312.         cb3^.Disable;
  313.         pb2^.Disable;
  314.         pb4^.Disable;
  315.         pb5^.Disable
  316.         { ... und alle Buttons etc. nicht anwählbar machen }
  317.     end;
  318.  
  319.  
  320. procedure TMFDialog.Load(dname: string);
  321.     var cmp: string[4];
  322.         p  : PDialog;
  323.  
  324.     begin
  325.         if length(dname)>0 then
  326.             if exist(dname) then
  327.                 begin
  328.                     { nur bearbeiten, wenn die Datei existiert! }
  329.                     cmp:=StrRight(dname,4);
  330.                     if (cmp<>'.PRG') and (cmp<>'.APP') and (cmp<>'.TOS') and (cmp<>'.TTP') and (cmp<>'.ACC') then
  331.                         begin
  332.                             { falscher Dateityp... }
  333.                             p:=new(PDialog,Init(@self,'Datei auswählen',MFALERT));
  334.                             if p<>nil then
  335.                                 begin
  336.                                     new(PStatic,Init(p,MFATITLE,2,true,''));
  337.                                     new(PButton,Init(p,MFAOK,id_OK,true,'Wählen Sie eine passende Datei aus!'));
  338.                                     Application^.ExecDialog(p)
  339.                                     { TDialog-Objekte versuchen normalerweise, den Dialog in
  340.                                       einem Fenster darzustellen; durch den Aufruf von
  341.                                       ExecDialog() wird der Dialog zwangsweise MODAL abge-
  342.                                       arbeitet und danach automatisch freigegeben
  343.                                       (als Rückgabe erhält man den Index des angewählten
  344.                                       Exit-Buttons, in diesem Fall nicht verwendet) }
  345.                                 end
  346.                         end
  347.                     else
  348.                         begin
  349.                             if RPos('\',dname)>0 then
  350.                                 begin
  351.                                     st1^.SetText('Datei: '+StrRight(dname,length(dname)-RPos('\',dname)));
  352.                                     { nur den Dateinamen anzeigen (ohne Pfad) }
  353.                                     pfad:=StrLeft(dname,RPos('\',dname))
  354.                                     { den Pfad merken wir uns dafür an dieser Stelle }
  355.                                 end
  356.                             else
  357.                                 begin
  358.                                     st1^.SetText('Datei: '+dname);
  359.                                     pfad:=''
  360.                                     {... für Dateien ohne Pfadangabe }
  361.                                 end;
  362.                             { Datei öffnen und aktuelle Werte auslesen... }
  363.                             assign(f,dname);
  364.                             reset(f);
  365.                             read(f,phrec);
  366.                             close(f);
  367.                             ttmem:=PByte(@phrec.ph_prgflags)^ shr 4;
  368.                             st2^.Enable;
  369.                             st3^.Enable;
  370.                             { Texte aktivieren... }
  371.                             UpdateAmount;
  372.                             { ... und neue Werte anzeigen }
  373.                             cb1^.Enable;
  374.                             if bTst(phrec.ph_prgflags,PH_FASTLOAD) then cb1^.Check
  375.                             else
  376.                                 cb1^.Uncheck;
  377.                             { es gibt zwar auch eine SetCheck-Methode, aber so
  378.                               ist es doch recht übersichtlich! }
  379.                             cb2^.Enable;
  380.                             if bTst(phrec.ph_prgflags,PH_LOADALT) then cb2^.Check
  381.                             else
  382.                                 cb2^.Uncheck;
  383.                             cb3^.Enable;
  384.                             if bTst(phrec.ph_prgflags,PH_MALLOCALT) then cb3^.Check
  385.                             else
  386.                                 cb3^.Uncheck;
  387.                             pb2^.Enable;
  388.                             pb4^.Enable;
  389.                             pb5^.Enable
  390.                         end
  391.                 end
  392.     end;
  393.  
  394.  
  395. begin
  396.   MFApplication.Init('MFST','MakeFast');
  397.   { Anwendung initialisieren;
  398.     übergeben wird ein Cookie (alle ObjectGEM-Anwendungen tragen sich
  399.     nach Möglichkeit für die Dauer ihrer Ausführung in den Cookie-Jar
  400.     ein) und ein String, der bei einem ACC als Menüeintrag verwendet
  401.     wird }
  402.   MFApplication.Run;
  403.   { Programm ausführen... }
  404.   MFApplication.Done
  405.   { ... und korrekt verlassen! }
  406. end.